package util;

/**
 * 10进制转换任意进制函数
 */
public class IntegerUtil {
	//整形范围
	public static final int SIZE = 1 << 5;
	//double比较的范围
	private static final double COMPARE_BASE = 0.0000000001D;
	/**
	 * 十进制->2进制 整数处理部分
	 * @param num
	 * @param sign 进制的权
	 * @return
	 */
	public static String toBinaryString(int num, int sign) {
		int k = 1;
		int temp = 0;
		while (num != 0) {
			int unit = num % sign ;
			temp = unit * k + temp;
			k *= 10;
			num /= sign;
		}
		return String.valueOf(temp >= Integer.MAX_VALUE ? Integer.MAX_VALUE : temp);
	}
	
	/**
	 * 十进制转二进制(包括小数) 
	 * @param num 十进制小数
	 * @param sign 带转换进制 目前仅支持二进制
	 * @param size 保留的小数位数
	 * @return
	 */
	public static String toLiteralString(double num, int sign, int size) {
		//整数部分
		int left = (int) num;
		//旧版本
		//String leftStr = toBinaryString(left, sign);
		String leftStr = toBinaryString(left);
		//小数部分
		double liter = num - left;
		
		StringBuffer rightStr = new StringBuffer("");
		if (size <= 0)
			size = SIZE;
		double temp = 0D;
		//最多运行32位
		while (liter > COMPARE_BASE && size-- > 0) {
			 temp = liter * sign;
			if (temp >= 1) {
				rightStr.append("1");
				liter = temp - 1;
			} else  {
				rightStr.append("0");
				liter = temp;
			}
		}
		if (rightStr.length() != 0) 
			return leftStr + "." + rightStr.toString();
		return leftStr;
		
		
	}
	
	/**
	 * 高效实现
	 * 32 ->  0000 0000 0000 0000 0000 0000 0010 0000 -> 移动31位 -> 移动30 ->..
	 * 将每次移位结果 & 1 取最低位
	 * @param num
	 * @return
	 */
	public static String toBinaryString(int num) {
		String res = "";
		if (num == 0) return res + "0";
		for(int i = 31; i >= 0; i--) {
			res += ( num >>> i & 1);
		}
		int index = res.indexOf("1");
		return index == -1 ? res : res.substring(index);
	}
	
	/**
	 * 二进制字符串转十进制
	 * 
	 * @param binaryString
	 * @return
	 * @throws Exception
	 */
	public static int binaryToDec(String binaryString) throws Exception {
		if (binaryString == null 
				|| (binaryString.indexOf('0') == -1 
				&& binaryString.indexOf('1') == -1)) {
			throw new Exception("invaild binary String: " + binaryString);
		}
		int dec = 0;
		int sign = 1;
		for (int i = binaryString.length() - 1; i >= 0; i--) {
			dec += (binaryString.charAt(i) - '0') * sign;
			sign *= 2; 
		}
		return dec;
		
	}
	
	
	public static void main(String[] args) throws Exception {
		//System.out.println(IntegerUtil.toLiteralString(0.03, 2, 32));
		System.out.println('\b');
/*		System.out.println(toBinaryString(110));
//		System.out.println(binaryToDec("1101"));
	*/}
}
